#ifndef RPC_MPRPC_PROVIDER_H
#define RPC_MPRPC_PROVIDER_H

#include <unordered_map>
#include <string>
#include <functional>
#include <google/protobuf/service.h>
#include <google/protobuf/descriptor.h>
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/TcpConnection.h>

namespace rpc {

/**
 * @brief 基于muduo库的RPC服务端核心模块
 * 1. 注册protobuf定义的业务服务（如Raft的raftRpc服务）
 * 2. 监听网络端口，接收客户端RPC请求
 * 3. 解析请求并映射到本地服务方法
 * 4. 执行方法并返回响应
 */
class MprpcProvider {
public:
    /**
     * @brief 注册protobuf服务对象
     * @param service 服务实例（由业务层实现，如Raft节点）
     * @note 线程安全，可在多线程中调用
     */
    void NotifyService(google::protobuf::Service* service);

    /**
     * @brief 启动服务提供者，开始监听端口并处理请求
     * @param nodeIndex 节点标识
     * @param port 端口号
     */
    void Run(int nodeIndex, short port);

private:
    /**
     * @brief 处理新连接的回调函数
     * @param conn 连接对象（muduo封装的TCP连接）
     */
    void OnConnection(const muduo::net::TcpConnectionPtr& conn);
   
    /**
     * @brief 处理客户端消息的回调函数
     * @param conn 连接对象
     * @param buf 数据缓冲区
     * @param receive_time 接收时间戳
     */
    void OnMessage(const muduo::net::TcpConnectionPtr& conn,
                muduo::net::Buffer* buf,
                muduo::Timestamp receive_time);
    
    /**
     * @brief Closure的回调操作，用于序列化rpc的响应和网络发送
     * @param conn 连接对象
     * @param response 序列化响应
     */
    void SendRpcResponse(const muduo::net::TcpConnectionPtr& conn, google::protobuf::Message* response);

private:
    muduo::net::EventLoop m_eventloop;

    struct ServiceInfo {
        google::protobuf::Service* m_service;
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> m_methodMap; // 保存服务方法 【服务模块 【方法名 方法描述符】】
    };

    std::unordered_map<std::string, ServiceInfo> m_serviceMap;  // 存储注册成功的服务对象和其服务方法的所有信息
};

}  // namespace rpc

#endif  // RPC_MPRPC_PROVIDER_H
